package com.yupi.springbootinit.manager;
import com.yupi.springbootinit.common.ErrorCode;
import com.yupi.springbootinit.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * @author 28993
 */
@Service
@SuppressWarnings("All")
public class RedisCurrentLimitingManager {

	@Resource
	private RedissonClient redissonClient;

	/**
	 * 限流操作
	 * 这里 面使用user作为key 也就是说对同一个用户来说在一秒内最多来
	 * @param key 区分不同的限流器，比如不同的用户 id 应该分别统计
	 */
	public void doRateLimit(String key) {
		// 创建一个名称为user_limiter的限流器，每秒最多访问 2 次
		RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
		rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
		/**
		 *  每当一个操作来了后，请求一个令牌
		 * 	boolean b = rateLimiter.tryAcquire()<==>rateLimiter.tryAcquire(1);
		 */
		boolean canOp = rateLimiter.tryAcquire(1);
		if (!canOp) {
			throw new BusinessException(ErrorCode.TOO_MANY_REQUEST_ERROR);
		}
	}
}
